home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 11, No. 08 (1990-08)(MindCraft Publishing)(Side A)[a].zip / Nibble Volume 11, No. 08 (1990-08)(MindCraft Publishing)(Side A)[a].po / SAVER.ASM.txt < prev    next >
Text File  |  1996-12-24  |  11KB  |  573 lines

  1.  
  2.  
  3. **********************************
  4. *                                *
  5. *    SAVER.ASM Source Code       *
  6. *        by Thomas Dorris        *
  7. *                                *
  8. *        Copyright (c) 1990      *
  9. *       MindCraft Publ. Corp.    *
  10. *        Concord, MA  01742      *
  11. *         Orca/M Assembler       *
  12. ********************************** 
  13.  
  14.          MCOPY SAVER.MAC
  15.          KEEP  SAVER
  16.  
  17. *
  18. *  Global equates
  19. *
  20.            keep     'rampatch'
  21.            org      $9c00
  22.  
  23. COL80CLR GEQU   $E1C00C                 ;Sets 40 column mode
  24. OS_ID    GEQU   $E100BC                 ;1 for ProDOS 16
  25. SCREEN   GEQU   $E12000                 ;Super Hires screen
  26. BANK0    GEQU   $000C00                 ;Start Bank0 program
  27.  
  28.  
  29. MAIN     START 
  30.  
  31.  
  32. *
  33. *  Initial data for a Classic Desk Accessory
  34. *
  35.  
  36.  
  37.          STR   'Screen Saver'           ;Title of CDA
  38.          DC    I4'SSSTART'              ;starting code
  39.          DC    I4'SSEND'                ;shutdown code
  40.  
  41.  
  42. *
  43. *
  44. *  Main code block
  45. *
  46. *
  47.  
  48.  
  49. SSSTART  PHK
  50.          PLB                            ;Set data bank
  51.  
  52.          SEP   #$20
  53.          STA   COL80CLR
  54.          REP   #$30 
  55.  
  56.          LDA   #TITLE
  57.          JSR   DISPLAY                  ;Clear screen
  58.  
  59.          JSR   GETLINE                  ;Input name of file
  60.          AND   #$00FF                   ;Acc contains length
  61.          BEQ   SSEND                    ;If length=0, exit
  62.  
  63.          LDA   #$A3                     ;Display screen
  64.          STA   $E1C029
  65.  
  66.          JSR   CHCKID
  67.          BEQ   PRO16
  68.  
  69.          JSR   DOPRO8
  70.          BNE   ERROR 
  71.          BRA   CLS2
  72.  
  73. PRO16    DESTROY CREATEPARM             ;Close and delete file
  74.          BCC   CRT
  75.          CMP   #$46
  76.          BNE   ERROR 
  77.  
  78. CRT      CREATE CREATEPARM              ;Create new file
  79.          BCS   ERROR
  80.  
  81.          OPEN  OPENPARM
  82.          BCS   ERROR
  83.  
  84.          LDA   OPENPARM                 ;Save reference number
  85.          STA   WRITEPARM
  86.  
  87.          WRITE WRITEPARM                ;Write screen data to disk
  88.          BCS   ERROR
  89.  
  90. CLS      CLOSE OPENPARM                 ;Close and return
  91. CLS2     JSR   DSPOFF
  92.  
  93. SSEND    RTL
  94.  
  95.  
  96. *
  97. *
  98. *  Error code.  Displays error message and exits
  99. *
  100. *
  101.  
  102. ERROR    PHA
  103.  
  104.          JSR   DSPOFF                   ;Set text mode
  105.          LDA   #ERRMSG 
  106.          JSR   DISPLAY                  ;print error message
  107.  
  108.          PLA 
  109.  
  110.          SEP   #$20
  111.          LONGA OFF
  112.  
  113.          PHA
  114.          AND   #$F
  115.          TAX
  116.          LDA   LST,X
  117.          ORA   #$80
  118.          STA   $E0053A
  119.          PLA
  120.          LSR   A
  121.          LSR   A
  122.          LSR   A
  123.          LSR   A
  124.          TAX
  125.          LDA   LST,X
  126.          ORA   #$80 
  127.          STA   $E00539
  128.          REP   #$30
  129.  
  130.          LONGA ON 
  131.  
  132. WT       LDA   $E1BFFF                  ;Get key
  133.          BPL   WT
  134.          STA   $E1C010 
  135.  
  136.          JSR   CHCKID
  137.          BNE   CLS2
  138.  
  139.          BRA   CLS                      ;Close if opened and exit
  140.  
  141. LST      ASC   '0123456789ABCDEF' 
  142.  
  143. DSPOFF   LDA   #$1                      ;Go to text mode
  144.          STA   $E1C029
  145.          RTS
  146.  
  147. CHCKID   LDA   OS_ID
  148.          AND   #$00FF
  149.          CMP   #$1
  150.          RTS
  151.  
  152. *
  153. *
  154. *  Clears screen and displays message block
  155. *
  156. *
  157.  
  158.  
  159. DISPLAY  LDX   #$3FE
  160.          STA   LOADADR+1
  161.          STA   LDADR1+1 
  162.          LDA   #$A0A0
  163. CLEAR    STA   $E00400,X                ;Store space
  164.          DEX
  165.          DEX
  166.          BPL   CLEAR
  167.  
  168.          LDY   #$FFFE
  169.  
  170. INCRY    INY
  171.          INY
  172.  
  173.  
  174. LOADADR  LDX   TITLE,Y                  ;Get screen address
  175.          BEQ   DISPDONE                 ;If zero, end of data
  176.  
  177. INCRX    INY
  178.          INY
  179. LDADR1   LDA   TITLE,Y                  ;Get character
  180.          BEQ   INCRY                    ;If zero, get next line
  181.          ORA   #$8080 
  182.          STA   $E00400,X
  183.          INX
  184.          INX 
  185.          BRA   INCRX
  186.  
  187. DISPDONE RTS
  188.  
  189.  
  190. *
  191. *
  192. *  Input line.  Ignores all but alphanumeric keys
  193. *
  194. *
  195.  
  196.  
  197. GETLINE  LDA   #NAME-STRT8+START8       ;location of P8 path
  198.          STA   ZPG2+1
  199.          INC   A
  200.          STA   ZPG1+1 
  201.           
  202.          SEP   #$20                     ;8-bit accumulator mode
  203.          LONGA OFF
  204.  
  205. GETKEY1  LDX   #0
  206.  
  207. GETKEY   LDA   #$2E
  208.          STA   $E00528,X
  209.  
  210.          JSR   WAIT                     ;Get key and mask
  211.          AND   #$7F
  212.  
  213.          CMP   #$60                     ;Convert to upper case
  214.          BCC   UPPER
  215.          EOR   #$20 
  216.  
  217. UPPER    CMP   #$8
  218.          BNE   NTBKSP
  219.  
  220. BKSP     LDA   #$AE                     ;delete cursor
  221.          STA   $E00528,X
  222.          DEX                            ;Decrease counter
  223.          BPL   GETKEY
  224.          BMI   GETKEY1
  225.  
  226. NTBKSP   CMP   #$5F                     ;If delete, do backspace
  227.          BEQ   BKSP 
  228.  
  229.          CMP   #$20                     ;If SPACE,screen display
  230.          BEQ   SCNDIS
  231.  
  232.          CMP   #$1B                     ;If ESC, exit
  233.          BEQ   ESC
  234.  
  235.          CMP   #$0D                     ;If return, done
  236.          BEQ   KEYDONE 
  237.  
  238.          CMP   #$2E
  239.          BCC   GETKEY                   ;Check for period and slash
  240.          CMP   #$3A
  241.          BCC   KEYOK
  242.  
  243.          CMP   #$41                     ;Check for alpha-keys
  244.          BCC   GETKEY
  245.          CMP   #$5B
  246.          BCS   GETKEY
  247.  
  248. KEYOK    STA   BUF+1,X                  ;Store key in buffer (P16)
  249. ZPG1     STA   NAME+1,X                 ;Store key in buffer (P8) 
  250.          ORA   #$80
  251.          STA   $E00528,X                ;Display on screen
  252.          CPX   #38
  253.          BEQ   GETKEY
  254.          INX
  255.          BRA   GETKEY
  256.  
  257. SCNDIS   LDA   #$A3
  258.          STA   $E1C029 
  259.          JSR   WAIT
  260.          LDA   #1
  261.          STA   $E1C029
  262.          BRA   GETKEY 
  263.  
  264. ESC      LDX   #0
  265. KEYDONE  TXA
  266.          STA   BUF
  267. ZPG2     STA   NAME 
  268.          REP   #$30
  269.          LONGA ON
  270.  
  271.          RTS 
  272.  
  273.  
  274. WAIT     LDA   $E1C000
  275.          BPL   WAIT
  276.          STA   $E1C010
  277.          RTS
  278.  
  279. *
  280. *
  281. *  Swap bank 0, execute, & swap back
  282. *
  283. *
  284.  
  285. DOPRO8   JSR   SWAP                     ;Swap in Bank0 code
  286.  
  287.          JSL   BANK0                    ;Execute
  288.  
  289.          PHA
  290.          JSR   SWAP                     ;Replace original data
  291.          PLA
  292.          RTS 
  293.  
  294.  
  295. SWAP     LDX   #END8-START8-2           ;length of Bank0 code
  296. SWAP1    LDA   START8,X
  297.          PHA
  298.  
  299.          DC    I1'$BF,0,8,0'            ;=LDA BANK0,X
  300.  
  301.          STA   START8,X
  302.          PLA
  303.  
  304.          DC    I1'$9F,0,8,0'            ;=STA BANK0,X
  305.  
  306.          DEX
  307.          DEX
  308.          BPL   SWAP1
  309.          RTS
  310.  
  311.  
  312. *
  313. *
  314. *  Title screen data
  315. *
  316. *
  317.  
  318.  
  319. TITLE    DC    I2'$00B'
  320.          ASC   'Nibble Screen Saver '
  321.          DC    I2'0'
  322.  
  323.          DC    I2'$08E' 
  324.          ASC   'Thomas Dorris '
  325.          DC    I2'0'
  326.  
  327.          DC    I2'$380' 
  328.          ASC   'Enter name to save screen as: '
  329.          DC    I2'0'
  330.  
  331.          DC    I2'$028'
  332.          ASC   'Include prefix and subdirectory '
  333.          DC    I2'0'
  334.  
  335.          DC    I2'$128'
  336.          ASC   '....................................... '
  337.          DC    I2'0'
  338.  
  339.          DC    I2'$3A8'
  340.          ASC   'Press [SPACE] to view screen'
  341.          DC    I2'0'
  342.  
  343.          DC    I2'$0D0' 
  344.          ASC   'Press [ESC] to abort to accessories '
  345.          DC    I2'0'
  346.  
  347.          DC    I2'0' 
  348.  
  349.  
  350. *
  351. *  Error message data
  352. *
  353. *
  354.  
  355.  
  356. ERRMSG   DC    I2'$12D'
  357.          ASC   'Error code $   has occurred!'
  358.          DC    I2'0' 
  359.  
  360.          DC    I2'$2AD'
  361.          ASC   'Press any key to abort'
  362.          DC    I2'0'
  363.  
  364.          DC    I2'0' 
  365.  
  366.  
  367. *
  368. *
  369. *  ProDOS information
  370. *
  371. *
  372.  
  373. BUF      DS    40                       ;File name
  374. HNDL     DC    I4'START8'
  375.  
  376.  
  377. OPENPARM DS    2                        ;Room for reference #
  378.          DC    I4'BUF'                  ;Filename pointer
  379.          DC    I4'HNDL'                 ;IO buffer handle
  380.  
  381.  
  382. CREATEPARM DC  I4'BUF'                  ;Filename
  383.          DC    I2'$C3'                  ;Access type
  384.          DC    I2'$C1'                  ;File type
  385.          DC    I4'0'                    ;Aux type
  386.          DC    I2'1'                    ;Storage type
  387.          DC    I4'0'                    ;Date stuff
  388.  
  389.  
  390. WRITEPARM DS   2                        ;number location
  391.          DC    I4'SCREEN'               ;super hires screen
  392.          DC    I4'32768'                ;Length of screen data
  393.          DC    I4'0'                    ;Room for amount written
  394.  
  395.  
  396. START8   ANOP
  397.  
  398.  
  399. *
  400. *
  401. *  ProDOS 8 equates
  402. *
  403. *
  404.  
  405. MLI      EQU   $BF00                    ;ProDOS 8 MLI call
  406. BITMAP   EQU   $BF58                    ;areas available for ProDOS
  407. MLIACT   EQU   $BF9B                    ;Bit 7 tells if active
  408. ZPAGE    EQU   $FA                      ;Used as pointer
  409.  
  410. CCREATE  EQU   $C0
  411. CDESTROY EQU   $C1 
  412. COPEN    EQU   $C8
  413. CWRITE   EQU   $CB
  414. CCLOSE   EQU   $CC 
  415.  
  416.  
  417. *
  418. *
  419. *  ProDOS 8 main routine
  420. *
  421. *
  422.  
  423.          OBJ   $800 
  424.  
  425. STRT8    ANOP
  426.  
  427. OPNBUF   DS    1024 
  428.  
  429.          PHD                            ;Save direct page
  430.          PEA   $0000
  431.          PLD
  432.  
  433.          PHB
  434.          PHK
  435.          PLB
  436.  
  437.          LDA   ZPAGE                    ;Save zero page usage
  438.          PHA
  439.          LDA   ZPAGE+2
  440.          PHA
  441.  
  442.          LDA   #SCREEN                  ;Set up pointer to screen
  443.          STA   ZPAGE
  444.          LDA   #^SCREEN
  445.          STA   ZPAGE+2 
  446.  
  447.          LONGA OFF
  448.          LONGI OFF 
  449.  
  450.          SEC
  451.          XCE
  452.          SEP   #$20
  453.  
  454.          LDA   BITMAP+1
  455.          STA   MAPBYTE
  456.          STZ   BITMAP+1
  457.  
  458.          JSR   MLI                      ;Destroy file
  459.          DC    I1'CDESTROY'
  460.          DC    I2'DESTPARM8'
  461.  
  462.          BEQ   DESTOK
  463.          CMP   #$46                     ;FILE NOT FOUND
  464.          BNE   EXIT
  465.  
  466. DESTOK   JSR   MLI                      ;Create file
  467.          DC    I1'CCREATE'
  468.          DC    I2'CREATEPARM8'
  469.          BNE   EXIT
  470.  
  471.          JSR   MLI                      ;Open file
  472.          DC    I1'COPEN'
  473.          DC    I2'OPENPARM8'
  474.          BNE   EXIT 
  475.  
  476.          LDA   OPENREF
  477.          STA   WRITEREF
  478.          STA   CLSREF 
  479.           
  480. MOVEMORE LDY   #0
  481. MOVE     LDA   [ZPAGE],Y
  482.          STA   WRTBUF,Y
  483. NOINC    INY
  484.          BNE   MOVE
  485.  
  486.          INC   ZPAGE+1 
  487.  
  488.          JSR   MLI                      ;Write next segment
  489.          DC    I1'CWRITE'
  490.          DC    I2'WRITEPARM8'
  491.          BNE   EXIT
  492.  
  493.          LDA   ZPAGE+1
  494.          CMP   #$A0
  495.          BNE   MOVEMORE 
  496.  
  497.          LDA   #0                       ;Load Acc with no error
  498.  
  499. EXIT     STA   ERROR8
  500.  
  501.          JSR   MLI
  502.          DC    I1'CCLOSE'
  503.          DC    I2'CLOSEPARM8'
  504.  
  505.          LDA   MAPBYTE                  ;Restore original bitmap
  506.          STA   BITMAP+1 
  507.  
  508.          LONGA ON
  509.          LONGI ON 
  510.           
  511.          CLC
  512.          XCE
  513.          REP   #$30
  514.  
  515.          PLA
  516.          STA   ZPAGE+2
  517.          PLA
  518.          STA   ZPAGE 
  519.  
  520.          LDA   ERROR8
  521.          AND   #$00FF
  522.  
  523.          PLB
  524.          PLD
  525.  
  526.          RTL 
  527.  
  528. *
  529. *
  530. *  ProDOS 8 parms
  531. *
  532. *
  533.  
  534. WRTBUF   DS    256
  535. ERROR8   DS    1
  536. MAPBYTE  DS    1
  537.  
  538. NAME     DS    40
  539.  
  540. DESTPARM8 DC   I1'1'
  541.          DC    I2'NAME'
  542.  
  543. CREATEPARM8 DC  I1'7'
  544.          DC    I2'NAME'
  545.          DC    I1'$C3'
  546.          DC    I1'$C1'
  547.          DC    I2'0'
  548.          DC    I1'1'
  549.          DC    I2'0'
  550.          DC    I2'0'
  551.  
  552. OPENPARM8 DC    I1'3'
  553.          DC    I2'NAME'
  554.          DC    I2'OPNBUF'
  555. OPENREF  DC    I1'1'
  556.  
  557. WRITEPARM8 DC   I1'4'
  558. WRITEREF DC    I1'1'
  559.          DC    I2'WRTBUF'
  560.          DC    I2'256'
  561.          DC    I2'0'
  562.  
  563. CLOSEPARM8 DC   I1'1'
  564. CLSREF   DC    I1'1'          
  565.  
  566.  
  567.          OBJEND
  568.  
  569. END8     ANOP
  570.  
  571.          END 
  572.